#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bool.h"
#include "data.h"
#include "key.h"
#include "tuple.h"
#include "ListaAsoc.h"
#include "dict.h"
#include "fmain.h"

struct sdict {
	ListaAsoc list;
};

struct sListaAsoc {
	tuple * array;
	int free;
	int size;
};

void imprimir_menu(void) {
	printf("\n");
	printf("=================MENU DE OPCIONES============== \n");
	printf("= 1* Para crear un diccionario                = \n");
	printf("= 2* Cargar un diccionario.                   = \n");
	printf("= 3* Guardar el diccionario.                  = \n");
	printf("= 4* Imprimir el diccionario.                 = \n");
	printf("= 5* Buscar una palabra y su definicion.      = \n");
	printf("= 6* Agregar una palabra al diccionario.      = \n");
	printf("= 7* Borrar una palabra del diccionario.      = \n");
	printf("= 8* Tamaño del diccionario.                  = \n");
	printf("= 9* Destruir el diccionario.                 = \n");
	printf("= 10* Salir.                                  = \n");
	printf("=============================================== \n");
	printf("\n");
}

int opcion(void) {
	int i = 0;
	printf("Ingrese una opcion: ");
	scanf("%d",&i);
	Continuar

	return i;
}

dict crear_diccionario(dict d) {
	if (d != NULL) {
		printf("Ya hay un diccionario creado.\n");
		}
	else {
		d = dict_empty();
		printf(" \n El diccionario se ha creado con exito.\n \n");
	}

	return d;
}

char* leer(FILE* f) {
	char c = '0';
	int i = 0, max_len = 10;
	char* p = (char*)calloc(max_len,sizeof(char));

	while((c = fgetc(f)) != EOF && c != '\n'){
		if (i == max_len -1){
			p = (char*)realloc(p,2*max_len);
			max_len = 2*max_len;
		}
		p[i] = c;
		i = i+1;
	}

	p[i] = '\0';

	return p;
}

int contar_lineas (FILE* fichero) {
  int contador_lineas;
  int actual;
  contador_lineas = 0;
  actual = getc(fichero);
  while (actual != EOF) {
      if (actual == '\n'){
      contador_lineas++;
	  }
      actual = getc(fichero);
	  }
return contador_lineas;
}

dict cargar_diccionario(dict d) {
	char* p;
	FILE* fichero;
	Word palabra = NULL;
	Def definicion = NULL;
	int i, j;

	printf("Ingrese el nombre del fichero \n");
	p = leer(stdin);

	if((fichero = fopen(p,"r"))){
		if (d != NULL) {
			printf("\nYa hay un diccionario creado.\n");
		}
		else {
			d = dict_empty();
			printf(" \n El diccionario se ha creado con exito.\n \n");
		}

		i = 0;
		j = contar_lineas(fichero);

		rewind(fichero);

		while (i < j) {
			palabra = leer(fichero);
			definicion = leer(fichero);

			dict_add(d,palabra,definicion);

			free(palabra);
			palabra = NULL;
			free(definicion);
			definicion = NULL;

			i = i+2;
		}

		printf("\nEl diccionario se ha cargado con exito..\n");

		fclose(fichero);
	}
	else{
		printf("\nEl archivo no existe !\n");
	}

	free(p);
	p=NULL;

	return d;
}

void buscar_palabra(dict d) {
	if (d != NULL) {
	char* s = NULL;
	char* p = NULL;

	printf("Ingrese la palabra: ");
	s = leer(stdin);
	p = dict_search(d,s);

	if(p == NULL){
		printf("La palabra no existe.\n");
		}
	else{
		printf("%s: %s\n", s, p);
		}

	printf("\n");
	free(p);
	p = NULL;
	free(s);
	s = NULL;
	}
	else {
		printf("No se ha cargado ningun diccionario. \n");
	}
}

void longitud_diccionario (dict d) {
	if (d != NULL) {
		printf("El diccionario tiene cargadas :");
		printf("%d definicion / es \n\n", dict_length(d));
	}
	else {
		printf("No se ha cargado ningun diccionario. \n");
	}
}

void agregar_palabra(dict d) {

	if (d != NULL) {

		Word palabra = NULL;
		Def definicion = NULL;

		printf("Ingrese una palabra: ");
		palabra = leer(stdin);

		printf("Ingrese la definicion: ");
		definicion = leer(stdin);

		if (dict_exists (d,palabra) == 0) {
			dict_add(d,palabra,definicion);
			printf("\n La definicion se ha cargado con exito \n");
		}
		else{
			printf("\nLa palabra ya existe..\n");
		}

		free(palabra);
		palabra = NULL;
		free(definicion);
		definicion = NULL;
	}
	else {
		printf("No se ha cargado ningun diccionario. \n");
	}
}


void borrar_palabra(dict d) {

	if (d != NULL) {
		Word palabra = NULL;

		printf("\nIngrese la palabra que desea borrar. \n \n");
		palabra = leer(stdin);

		if (dict_exists(d,palabra) != 0) {
			dict_del(d,palabra);
			printf("\n La palabra ha sido eliminada con exito. \n \n");
		}
		else {
			printf("\nLa palabra no existe en el diccionario. \n \n");
		}

		free(palabra);
		palabra = NULL;
	}
	else {
		printf("No se ha cargado ningun diccionario. \n");
	}

}

void mostrar_diccionario(dict d) {
	if (d != NULL) {
	dict_pprint (d);
	}
	else {
		printf("\n El diccionario esta vacio o no existe ! \n");
	}
}

dict destruir_diccionario(dict d) {
	d = dict_destroy(d);

	printf("\n El diccionario se elimino con exito..\n");

	return d;
}

void guardalista (ListaAsoc l,FILE *stream) {
	int i;
	char * p = NULL;
	char * q = NULL;
	for (i=0; i<l->free; i++) {
		p = (char*)calloc(key_lenght(tuple_fst(l->array[i]))+1,sizeof(char));
		key_toString(tuple_fst(l->array[i]),p);
		q = data_toString(tuple_snd(l->array[i]));
		fprintf(stream,"%s\n",p);
		fprintf(stream,"%s\n",q);
		free(p);
		p = NULL;
		free(q);
		q = NULL;
	}
}

void guardar_dict (dict d,FILE *stream) {
	guardalista(d->list,stream);
}

void guardar_archivo(dict d){
	char *p;
	FILE *f;
	printf("\nIngrese el archivo al que desea guardar: \n");
	p = leer(stdin);
	f = fopen(p,"w");
	f = freopen(p,"a",f);
	guardar_dict(d,f);
	fclose(f);
	free(p);
	p = NULL;
	puts("\nDiccionario guardado \n\n");
}

